/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ejercicio.practica10;

import java.util.Random;
import java.util.concurrent.locks.ReentrantLock;

/**
 *
 * @author manolo
 */
public class filoApiAN implements Runnable {

    private ReentrantLock tenedorIzquierdo;
    private ReentrantLock tenedorDerecho;
    Random rm = new Random();
    private int Id;

    public filoApiAN(ReentrantLock tenedorIzquierdo, ReentrantLock tenedorDerecho, int Id) {
        this.tenedorIzquierdo = tenedorIzquierdo;
        this.tenedorDerecho = tenedorDerecho;
        this.Id = Id;
    }

    private void pensar() throws InterruptedException {
        System.out.println("Filósofo " + Id + " está pensando");
        System.out.flush();
        Thread.sleep(rm.nextInt(1000));
    }

    private void comer() throws InterruptedException {
        System.out.println("Filósofo " + (Id+1) + " está comiendo");
        System.out.flush();
        Thread.sleep(rm.nextInt(1000));
    }

    private void cogerTenedorIzquierdo() throws InterruptedException {
        tenedorIzquierdo.lock();
        System.out.println("Filósofo " + (Id+1) + " coge el tenedor izquierdo");
        System.out.flush();
    }

    private void cogerTenedorDerecho() throws InterruptedException {
        tenedorDerecho.lock();
        System.out.println("Filósofo " + (Id+1) + " coge el tenedor derecho");
        System.out.flush();
    }

    private void soltarTenedores() {
        if (tenedorIzquierdo.isHeldByCurrentThread()) {
            tenedorIzquierdo.unlock();
            System.out.println("Filósofo " + (Id+1) + " suelta el tenedor izquierdo");
            System.out.flush();
        }
        if (tenedorDerecho.isHeldByCurrentThread()) {
            tenedorDerecho.unlock();
            System.out.println("Filósofo " + (Id+1) + " suelta el tenedor derecho");
            System.out.flush();
        }
    }

    @Override
    public void run() {
        try {
            while (true) {
                pensar();
                cogerTenedorIzquierdo();
                cogerTenedorDerecho();
                comer();
                soltarTenedores();
            }
        } catch (InterruptedException ex) {
            System.out.println("Error: " + ex);
        }

    }
}
